package o2o.service.multilingual;

import com.jinyou.utils.common.ValidateUtil;
import o2o.cache.order.OrderStatusNameMemory;
import o2o.config.dao.UserDaoSql;
import o2o.dao.PO.PojoTables;
import o2o.dao.PO.common.ResultInfo;
import o2o.dao.PO.order.OrderStatusName;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author qilonghe【1061268464@qq.com】
 * @ClassName OrderStatusNameService
 * @Description:
 * @date 2020/11/12 0012 上午 11:40
 * @Version 1.0
 */

@Service
public class OrderStatusNameService {

    public List<OrderStatusName> list(String param) {
        return OrderStatusNameMemory.getInstance().listAll(param);
    }

    public void add(OrderStatusName orderStatusName) throws SQLException {
        UserDaoSql.getInstance().saveObj(PojoTables.ORDER_STATUS_NAME, orderStatusName);

        OrderStatusNameMemory.getInstance().run();
    }

    public void modify(OrderStatusName orderStatusName) throws SQLException {
        UserDaoSql.getInstance().updateObj(PojoTables.ORDER_STATUS_NAME, orderStatusName, "id", orderStatusName.getId());

        OrderStatusNameMemory.getInstance().run();
    }

    public void delete(Long id) throws SQLException {
        OrderStatusName orderStatusName = new OrderStatusName();
        orderStatusName.setDelFlag(1);
        UserDaoSql.getInstance().updateObj(PojoTables.ORDER_STATUS_NAME, orderStatusName, "id", id);

        OrderStatusNameMemory.getInstance().run();
    }

    public ResultInfo excelImport(MultipartFile file, Connection con) throws Exception {
        StringBuffer bf = new StringBuffer();
        if (file == null) {
            return new ResultInfo("导入Excel文件不能为空\n");
        }

        // 获取工作簿
        XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());

        if (wb == null) {
            return new ResultInfo("导入Excel内容不能为空\n");
        }

        // 导入后的有效数据
        Map<String, OrderStatusName> map = new HashMap<>();

        int sheet_size = wb.getNumberOfSheets();// Excel的页签数量
        for (int index = 0; index < sheet_size; index++) {// 遍历sheet
            // 每个页签创建一个Sheet对象
            XSSFSheet sheet = wb.getSheetAt(index);

            if (sheet == null) {
                // 内容为空 -> 下一个工作表
                bf.append("第").append(index + 1).append("个工作表不能为空\n");
                continue;
            }
            for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) {// 遍历row  -> 跳过标题行,从第二行有数据的开始遍历
                OrderStatusName orderStatusName = new OrderStatusName();

                XSSFRow row = sheet.getRow(i);
                if (row == null) {
                    continue;
                }
                if (row.getLastCellNum() <= 12) {
                    bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行列数不能少于13列\n");
                    continue;
                }
                // 名称
                if (row.getCell(0) != null && StringUtils.isNotBlank(row.getCell(0).getStringCellValue())) {
                    if (map.containsKey(row.getCell(0).getStringCellValue())) {
                        // 导入数据中出现同一个名称的数据
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行导入重复名称的数据\n");
                        continue;
                    }
                    orderStatusName.setName(row.getCell(0).getStringCellValue());
                } else {
                    bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行名称不能为空\n");
                    continue;
                }
                StringBuffer langStr = new StringBuffer();
                langStr.append("{");
                // 英语(en)
                if (row.getCell(1) != null && StringUtils.isNotBlank(row.getCell(1).getStringCellValue())) {
                    langStr.append("\"en\":\"").append(row.getCell(1).getStringCellValue()).append("\",");
                }
                // 意大利语(it)
                if (row.getCell(2) != null && StringUtils.isNotBlank(row.getCell(2).getStringCellValue())) {
                    langStr.append("\"it\":\"").append(row.getCell(2).getStringCellValue()).append("\",");
                }
                // 法语(fr)
                if (row.getCell(3) != null && StringUtils.isNotBlank(row.getCell(3).getStringCellValue())) {
                    langStr.append("\"fr\":\"").append(row.getCell(3).getStringCellValue()).append("\",");
                }
                // 日语(ja)
                if (row.getCell(4) != null && StringUtils.isNotBlank(row.getCell(4).getStringCellValue())) {
                    langStr.append("\"ja\":\"").append(row.getCell(4).getStringCellValue()).append("\",");
                }
                // 波兰语(pl)
                if (row.getCell(5) != null && StringUtils.isNotBlank(row.getCell(5).getStringCellValue())) {
                    langStr.append("\"pl\":\"").append(row.getCell(5).getStringCellValue()).append("\",");
                }
                // 俄语(ru)
                if (row.getCell(6) != null && StringUtils.isNotBlank(row.getCell(6).getStringCellValue())) {
                    langStr.append("\"ru\":\"").append(row.getCell(6).getStringCellValue()).append("\",");
                }
                // 泰语(th)
                if (row.getCell(7) != null && StringUtils.isNotBlank(row.getCell(7).getStringCellValue())) {
                    langStr.append("\"th\":\"").append(row.getCell(7).getStringCellValue()).append("\",");
                }
                // 德语(de)
                if (row.getCell(8) != null && StringUtils.isNotBlank(row.getCell(8).getStringCellValue())) {
                    langStr.append("\"de\":\"").append(row.getCell(8).getStringCellValue()).append("\",");
                }
                // 老挝语(lo)
                if (row.getCell(9) != null && StringUtils.isNotBlank(row.getCell(9).getStringCellValue())) {
                    langStr.append("\"lo\":\"").append(row.getCell(9).getStringCellValue()).append("\",");
                }
                // 马来语(ms)
                if (row.getCell(10) != null && StringUtils.isNotBlank(row.getCell(10).getStringCellValue())) {
                    langStr.append("\"ms\":\"").append(row.getCell(10).getStringCellValue()).append("\",");
                }
                // 名称 多语言
                if (!"{".equals(langStr.toString())) {
                    String nameLang = langStr.toString();
                    nameLang = nameLang.substring(0, nameLang.length() - 1);
                    nameLang += "}";
                    orderStatusName.setNameLang(nameLang);
                }

                // 描述
                if (row.getCell(11) != null && StringUtils.isNotBlank(row.getCell(11).getStringCellValue())) {
                    orderStatusName.setDescs(row.getCell(11).getStringCellValue());
                } else {
                    bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行描述不能为空\n");
                    continue;
                }

                // 订单状态
                if (row.getCell(12) != null) {
                    row.getCell(12).setCellType(CellType.STRING);
                    if (row.getCell(12) != null && StringUtils.isNotBlank(row.getCell(12).getStringCellValue())) {
                        orderStatusName.setOrderStatus(Integer.valueOf(row.getCell(12).getStringCellValue()));
                    } else {
                        bf.append("第").append(index + 1).append("个工作表中，第").append(i + 1).append("行订单状态不能为空\n");
                        continue;
                    }
                }
                map.put(orderStatusName.getName(), orderStatusName);
            }
        }

        if (StringUtils.isNotBlank(bf.toString())) {
            return new ResultInfo(bf.toString());
        }

        // 验证通过 -> 导入数据
        return ImportData(map, con);
    }

    public ResultInfo ImportData(Map<String, OrderStatusName> map, Connection con) throws Exception {
        System.out.println("导入的数据::" + map.toString());
        List<OrderStatusName> list = OrderStatusNameMemory.getInstance().listAll(null);
        if (ValidateUtil.isAbsList(list) && null != map && !map.isEmpty()) {
            for (OrderStatusName orderStatusName : list) {
                if (map.containsKey(orderStatusName.getName())) {
                    // 有相同名称的 -> 视为同一数据 -> 只更新多语言字段
                    String nameLang = map.get(orderStatusName.getName()).getNameLang();// 导入的多语言
                    orderStatusName.setNameLang(nameLang);
                    UserDaoSql.getInstance().updateObj(PojoTables.ORDER_STATUS_NAME, map.get(orderStatusName.getName()), "id", orderStatusName.getId(), con);
                    // map移除
                    map.remove(orderStatusName.getName());
                }
            }
            // 新的数据 -> 导入
            for (Map.Entry<String, OrderStatusName> entry : map.entrySet()) {
                OrderStatusName orderStatusName = entry.getValue();
                UserDaoSql.getInstance().saveObj(PojoTables.ORDER_STATUS_NAME, orderStatusName, con);
            }
        }
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.setSuccess(true);
        return resultInfo;
    }
}